<?php

/*
 * @Description: 
 */
namespace app\model;

use think\Model;
use think\model\concern\SoftDelete;

class UserModel extends Model{
    // protected $name = 'user_model';
    // protected $pk = 'id';

     // 设置字段信息
    // protected $schema = [
    //     'id'          =  > 'int',
    //     'name'        => 'string',
    //     'status'      => 'int',
    //     'create_time' => 'datetime',
    //     'update_time' => 'datetime',
    // ];

    // 由于历史遗留问题，我们不再想使用某些字段，可以在模型里设置；
    // 设置后，我们在查询和写入时将忽略这些字段；
    // 设置废弃字段
    // protected $disuse = ["age", "details"];

    // 只读字段用来保护某些特殊的字段值不被更改，这个字段的值一旦写入，就无法更改；
    // 设置只读字段
    // protected $readonly = ["age", "details"];

    // 自动创建时间
    protected $autoWriteTimestamp = true;
    protected $createTime = 'create_time';
    protected $updateTime = 'update_time';
    // protected $updateTime = false;

    // 也可以动态实现不修改 update_time，具体如下：
    // $user->isAutoWriteTimestamp(false)->save();

    // 软删除
    // - 软删除也称为逻辑删除，只是给数据标记 “已删除” 的状态，不是真实的物理删除；
    // - 为何要对数据进行软删除，因为真实的物理删除，删了就没了呀。
    // - 在模型端设置软删除的功能，引入 **SoftDelete**，它是 **trait**；
    use SoftDelete;
    // 开启软删除，创建delete_time字段，并设置默认为 NULL
    protected $deleteTime = "delete_time";

    protected $defaultSoftDelete = 0;

    // 初始化
   // 修复：确保 init 方法与父类保持一致的签名
    protected function init()
    {
        // 调用父类的 init 方法
        // parent::init();
        // echo 'UserModel initialized';   
        // 在此处添加您的初始化逻辑
    }

    // 获取器
    //     - 获取器的作用是对模型实例的数据做出自动处理；
    // - 一个获取器对应模型的一个特殊方法，该方法为 public；
    // - 方法名的命名规范为：**getFieldAttr**()；
    // - 举个例子，数据库表示状态 status 字段采用的是数值；
    // - 而页面上，我们需要输出 status 字段希望是中文，就可以使用获取器；
// - 在 User 模型端，我创建一个对外的方法，如下：
    public function getStatusAttr($value, $data)    
    {
        $status = [
            0 => '正常',
            1 => '禁用',
        ];
        // 
        return $status[$value];
    }

    // 模型修改器
    // - 模型修改器的作用，就是对模型设置对象的值进行处理；
    // - 比如，我们要新增数据的时候，对数据就行格式化、过滤、转换等处理；
    // - 模型修改器的命名规则为：**setFieldAttr**；
    // - 我们要设置一个新增，规定输入的年龄都自动+100岁，修改器如下：
    public function setAgeAttr($value)
    {
        // - 除了新增，会调用修改器，修改更新也会触发修改器；
// - 模型修改器只对模型方法有效，调用数据库的方法是无效的，比如->insert();
        return $value + 100;
    }
    //  搜索器，模糊查找姓名
    public function searchNameAttr($query, $value, $data)
    {
       $query->where('name', 'like', '%' . $value . '%');
       // 按年龄排序
        if (isset($data["sort"])) {
            $query->order($data["sort"]);
        }
    }
    //  搜索器，年龄大于
    public function searchCreateTimeAttr($query, $value, $data)
    {
       $query->whereBetweenTime('create_time', $value[0], $value[1]);
    }

    // 当执行了查询方法，则调用我
        protected static function onAfterRead($user)
        {
            // $query是数据集，可用于数据判断
            echo "执行了查询！".$user->id;
        }
}
